from django.db import models

from django.contrib.auth.models import AbstractUser

import uuid


class UserProfile(AbstractUser):
    """ 用户资料 """
    
    # Enum department
    DEPARTMENT_CHOICES = (
        ('Model', '模型部'),
        ('Strategy', '策略部'),
        ('Data', '数据部'),
        ('Develop', '开发部'),
        ('Product', '产品部'),
        ('Business', '商务部'),
        ('Test', '测试部')
    )
    DEFAULT_DEPARTMENT = 'Model'

    # 用户编号
    uuid = models.UUIDField(primary_key=True, null=False, default=uuid.uuid4())

    # 是否为管理员(默认: False)
    is_admin = models.BooleanField(default=False)

    # 手机号码
    phone = models.CharField(max_length=11, null=True, unique=True, blank=False)

    # 公司部门
    department = models.CharField(max_length=20, choices=DEPARTMENT_CHOICES, default=DEFAULT_DEPARTMENT, blank=False)

    # 创建时间
    create_time = models.DateTimeField(auto_now_add=True, auto_now=False)

    # 更新时间
    update_time = models.DateTimeField(auto_now_add=False, auto_now=True)

    def __str__(self):
        # 用户名称
        return self.username

    class Meta:
        # App 名称
        app_label = "login"

        # 抽象基类
        abstract = False

        # 数据表名
        db_table = "user"

        # 查询数据的排序字段
        get_latest_by = ['username', 'update_time']

        # 默认由命令行管理工具迁徙(default: True)
        managed = True

        # 模型排序字段
        ordering = ['update_time', 'username']

        # 约束: 多键组合唯一约束
        unique_together = ['username', 'email', 'department']

        # 页面展示名称: verbose
        verbose_name = "用户信息"


class UserPrivilege(models.Model):
    """ Linux 服务器中 用户 以及用户组 所属权限. """

    # Enum department
    DEPARTMENT_CHOICES = (
        ('Model', '模型部'),
        ('Strategy', '策略部'),
        ('Data', '数据部'),
        ('Develop', '开发部'),
        ('Product', '产品部'),
        ('Business', '商务部'),
        ('Test', '测试部')
    )
    DEFAULT_DEPARTMENT = 'Model'

    # 用户 id
    uuid = models.OneToOneField(UserProfile, on_delete=models.CASCADE, primary_key=True, null=False)

    # 用户名
    username = models.CharField(help_text='用户姓名', max_length=128, null=True)

    # 公司部门
    department = models.CharField(max_length=20, choices=DEPARTMENT_CHOICES, default=DEFAULT_DEPARTMENT, blank=False)

    # 服务器名称
    server = models.CharField(help_text='服务器名称', default='Etl-Test-01', max_length=64)

    # 主机
    host_ip = models.GenericIPAddressField(help_text='主机IP', default='106.14.218.4')

    # Linux 用户
    host_user = models.CharField(help_text='Linux服务器上用户', max_length=32, null=True)

    # Linux UserId
    host_uid = models.CharField(help_text='Linux用户ID', max_length=10, null=True)

    # Linux GroupId
    host_gid = models.CharField(help_text='Linux用户组ID', max_length=10, null=True)

    # odps 数据表 下载权限
    download_odps_table = models.BooleanField(help_text='下载odps数据表权限', default=True)

    # oss 征信报告下载权限
    download_oss_report = models.BooleanField(help_text='下载oss征信报告权限', default=True)

    # 其它权限: 补充字段
    other_privilege = models.BooleanField(default=False)

    # 创建时间(auto_now_add=True 仅在首次创建时添加)
    create_time = models.DateTimeField(auto_now_add=True, auto_now=False)

    # 更新时间(auto_now=True 每次自动更新为当前时间)
    update_time = models.DateTimeField(auto_now_add=False, auto_now=True)

    class Meta:
        # label
        app_label = "login"
        
        # 抽象基类(默认: False)
        abstract = False
        
        # 数据表名
        db_table = "privilege"
        
        # 查询数据排序方式
        get_latest_by = ['uuid', 'update_time']
        
        # 是否由Django命令行工具管理进行迁徙, 默认: True
        managed = True
        
        # 数据模型排序字段
        ordering = ['uuid', 'update_time']

        # 前端页面展示
        verbose_name = '用户下载权限'


class UserLogin(models.Model):
    """ Login log 用户登陆日志记录表 ."""

    LOGIN_STATUS_CHOICES = (
        ('success', '登陆成功'),
        ('failed', '登陆失败'),
    )

    # 登陆记录 id
    login_id = models.AutoField(primary_key=True)

    # 登陆 IP
    login_ip = models.GenericIPAddressField(max_length=32, default='0.0.0.0')

    # 登陆账户
    login_account = models.CharField(max_length=64, null=False)

    # 登陆状态
    login_status = models.CharField(max_length=16, null=True)

    # 最近登陆时间（引起注意）
    last_login = models.DateTimeField(auto_now=False, auto_now_add=True)

    class Meta:
        # label
        app_label = "login"
        
        # 抽象基类
        abstract = False
        
        # 数据表名
        db_table = "login_log"
        
        # 查询数据的排序时间
        get_latest_by = ['login_id', 'update_time']
        
        # 是否由Django 命令行工具管理迁徙
        managed = True
        
        # 数据模型排序字段
        ordering = ['login_id', 'last_login']
        
        # 多键组合唯一约束
        unique_together = ['login_id', 'last_login']
        
        # 前端页面展示
        verbose_name = "登陆日志"
